using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

using RRHH.Competencias.DataAccessLayer.Generic;
using RRHH.Competencias.DataAccessLayer.SqlServerProvider;
using RRHH.Competencias.Entities;

namespace RRHH.Competencias.DataAccessLayer
{
    public class DALSqlServerProceso: IDALProceso
    {
       
        public DALSqlServerProceso() {}       


        public List<Proceso> BuscarTodos()
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_buscarTodos");
                

                DataTable dtProcesos = new DataTable();
                dtProcesos = stored.ExecuteDataTable();

                return CargarLista(dtProcesos);
                
            }
            catch (Exception ex)
            {
                
                throw new DALException(ex.Message);
            }
        }

        public List<Proceso> Buscar(Proceso proceso)
        {
            
            try
            {
                
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_buscar");
                
                if (proceso != null)
                {
                    if(!proceso.Id.Equals(0)) stored.AgregarParametro("@proceso_id", proceso.Id, typeof(long));
                    if(!proceso.Sector.Id.Equals(0)) stored.AgregarParametro("@sector_id", proceso.Sector.Id, typeof(long));
                    stored.AgregarParametro("@nombre", proceso.Nombre, typeof(string));
                    stored.AgregarParametro("@descripcion", proceso.Descripcion, typeof(string));
                }

                DataTable dtProcesos = new DataTable();
                dtProcesos = stored.ExecuteDataTable();

                return CargarLista(dtProcesos);

            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }

        }

        public List<Colaborador> ObtenerColaboradores(Proceso proceso)
        {
            List<Colaborador> colaboradores = new List<Colaborador>();
            
            if (proceso == null || proceso.Id <= 0) throw new DALException("Debe indicar el proceso");

            DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_buscarColaboradoresProcesoPuesto");
            stored.AgregarParametro("@proceso_id", proceso.Id);

            DataTable tabla = stored.ExecuteDataTable();

            foreach (DataRow fila in tabla.Rows)
            {
                Colaborador colaborador = new Colaborador();
                colaborador.Id = Convert.ToInt64(fila["persona_id"]);
                colaborador.IdColaborador = Convert.ToInt64(fila["colaborador_id"]);

                if (!colaboradores.Contains(colaborador)) colaboradores.Add(colaborador);
            }

            return colaboradores;
       }

        #region Miembros de IDALABM<Proceso>

        public void Completar(Proceso itemCompletar)
        {
            try
            {
                
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_buscar");

                if (!itemCompletar.Id.Equals(0)) stored.AgregarParametro("@proceso_id", itemCompletar.Id, typeof(long));                   
               
                DataTable dtProcesos = new DataTable();
                dtProcesos = stored.ExecuteDataTable();

                if (dtProcesos.Rows.Count > 0)
                {                    
                    itemCompletar.Id = Convert.ToInt64(dtProcesos.Rows[0]["proceso_id"]);
                    itemCompletar.Nombre = dtProcesos.Rows[0]["nombre"].ToString();
                    itemCompletar.Descripcion = dtProcesos.Rows[0]["descripcion"].ToString();

                    itemCompletar.Sector = new Sector();
                    itemCompletar.Sector.Id = Int64.Parse(dtProcesos.Rows[0]["sector_id"].ToString());  
                }

            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        public void Guardar(Proceso item)
        {
            try
            {

                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_insertar");
                
                stored.AgregarParametro("@sector_id", item.Sector.Id);
                stored.AgregarParametro("@nombre", item.Nombre);
                stored.AgregarParametro("@descripcion", item.Descripcion);

                item.Id = Convert.ToInt64(stored.ExecuteScalar());
                
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        public void GuardarOActualizar(Proceso item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Actualizar(Proceso item)
        {
            
            try
            {
                
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_actualizar");

                stored.AgregarParametro("@proceso_id", item.Id);
                stored.AgregarParametro("@sector_id", item.Sector.Id);
                stored.AgregarParametro("@nombre", item.Nombre);
                stored.AgregarParametro("@descripcion", item.Descripcion);
                stored.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                
                throw new DALException(ex.Message);
            }
        }

        public void Borrar(Proceso item)
        {
            
            try
            {
                
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_borrar");

                stored.AgregarParametro("@proceso_id", item.Id);
                stored.ExecuteNonQuery();

            }
            catch (Exception ex)
            {
                
                throw new DALException(ex.Message);
            }

        }

        public void Activar(Proceso item)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        public void Desactivar(Proceso item)
        {
            throw new Exception("The method or operation is not implemented.");
        }
        
        private List<Proceso> CargarLista(DataTable dt)
        {
            
            List<Proceso> lstProcesos = new List<Proceso>();
            
            foreach (DataRow dRow in dt.Rows)
            {
                
                Proceso proceso = new Proceso();
                proceso.Id = Convert.ToInt64(dRow["proceso_id"]);
                proceso.Nombre = dRow["nombre"].ToString();
                proceso.Descripcion = dRow["descripcion"].ToString();
                proceso.Sector = new Sector();
                proceso.Sector.Id = Int64.Parse(dRow["sector_id"].ToString());

                lstProcesos.Add(proceso);

            }

            return lstProcesos;

        }

        public void AsignarConocedor(long idConocedor, long idProceso)
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_insertarColaboradores");
                stored.AgregarParametro("@proceso_id", idProceso);
                stored.AgregarParametro("@colaborador_id", idConocedor);
                stored.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        public void QuitarConocedores(long idProceso)
        {
            try
            {
                DALSqlServerStoredProcedure stored = new DALSqlServerStoredProcedure("PA_ADUS_Proceso_borrarColaboradores");
                stored.AgregarParametro("@proceso_id", idProceso);
                stored.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new DALException(ex.Message);
            }
        }

        #endregion
    }
}
